package role

import (
	"errors"
	"github.com/gin-gonic/gin"
	"gorm.io/gorm"
	RoleModel "jy_go/app/admin/model/role"
	"jy_go/app/admin/model/role_power"
	"jy_go/common"
	"jy_go/db"
	"jy_go/jy_log"
	"math"
	"net/http"
	"strconv"
	"strings"
)


var (
	Db = db.GetDb()
)

// @Summary 角色列表
// @Description 角色列表
// @Tags 角色列表
// @Accept mpfd
// @Param limit query int false "当前显示的条数，默认10"
// @Param page query int false "当前页，默认1"
// @Success 200 {string} string "{"message": "查询成功","code":"success"}"
// @Failure 400 {string} string "{"message": "错误传参","code":"error"}"
// @Router /admin/role_lst [post]
func Lst(c *gin.Context){
	Limit, err := strconv.Atoi(c.DefaultPostForm("limit", "10"))
	if err != nil{
		c.JSON(400,gin.H{"code":"error","message":"错误传参"})
		return
	}
	Page,err := strconv.Atoi(c.DefaultPostForm("page", "1"))
	if err != nil{
		c.JSON(400,gin.H{"code":"error","message":"错误传参"})
		return
	}

	//初始化结构体
	var model RoleModel.Role
	var data = make([]RoleModel.Data, 0)
	var count int64
	dbtitle := Db.Model(&model).
		Joins("as r JOIN jy_role_power as rp ON rp.role_id = r.id").
		Joins("JOIN jy_power as p ON p.id = rp.power_id").
		Group("r.id")

	if err := dbtitle.Count(&count).Error;err != nil{
		if errors.Is(err,gorm.ErrRecordNotFound){
			c.JSON(200,gin.H{"code":"success","message":"暂无数据","data":data,"limit":Limit,"page":Page,"count":0})
			return
		}
		go jy_log.JyLog("查询失败，err：" + err.Error())
		c.JSON(400,gin.H{"code":"error","message":"查询失败"})
		return
	}

	dbtitle.Select("r.*,GROUP_CONCAT(p.name) as power_name").Limit(Limit).Offset((Page - 1) * Limit).Find(&data)

	c.JSON(200,gin.H{"code":"success","message":"查询成功","data":data,"limit":Limit,"page":Page,"count":math.Ceil(float64(count) / float64(Limit))})
	return
}

// @Summary 角色添加
// @Description 角色添加
// @Tags 角色添加
// @Accept mpfd
// @Param id query string true "id"
// @Param name query string true "name"
// @Param power_id query string true "power_id"
// @Success 200 {string} string "{"message": "修改成功","code":"success"}"
// @Failure 400 {string} string "{"message": "修改失败","code":"error"}"
// @Router /admin/role_add [post]
func Add(c *gin.Context)  {
	var form RoleModel.Role

	if err := c.Bind(&form); err != nil {
		c.JSON(http.StatusBadRequest, gin.H{"error": err})
		return
	}

	//验证数据
	if err := common.Validate(&form); err != ""{
		c.JSON(400,gin.H{"code":"error","message":err})
		return
	}

 	PowerId := c.Query("power_id")

	if len(PowerId) < 1 {
		c.JSON(http.StatusBadRequest, gin.H{"code":"error","message":"请选择角色权限"})
		return
	}

	if err := Db.Transaction(func(tx *gorm.DB) error {
		// 在事务中执行一些 db 操作（从这里开始，您应该使用 'tx' 而不是 'db'）
		if err := tx.Create(&form).Error; err != nil {
			// 返回任何错误都会回滚事务
			return err
		}

		//PowerId := strings.Split("", PowerId)
		var Data []role_power.RolePower

		RolePowerData := role_power.RolePower{}

		PowerIdArr := strings.Split(PowerId,",")
		for i, n := 0, len(PowerIdArr); i < n; i++ { // 常见的 for 循环，支持初始化语句。
			RolePowerData.RoleId = form.ID
			Pid,err := common.StrChangeUint(PowerIdArr[i])
			if err != nil{
				return err
			}

			RolePowerData.PowerId = Pid
			Data = append(Data,RolePowerData)
		}

		if err := tx.Create(&Data).Error;err != nil{
			return err
		}

		// 返回 nil 提交事务
		return nil
	});err != nil{
		go jy_log.JyLog("添加失败，err：" + err.Error())
		c.JSON(400,gin.H{"code":"error","message":"添加失败,err:"+err.Error()})
		return
	}
	
	c.JSON(200,gin.H{"code":"success","message":"添加成功"})
	return
}

// @Summary 角色修改
// @Description 角色修改
// @Tags 角色修改
// @Accept mpfd
// @Param id query string true "id"
// @Param name query string true "name"
// @Param power_id query string true "power_id"
// @Success 200 {string} string "{"message": "修改成功","code":"success"}"
// @Failure 400 {string} string "{"message": "修改失败","code":"error"}"
// @Router /admin/role_upd [post]
func Upd(c *gin.Context)  {
	//接收数据
	var form RoleModel.Role

	if err := c.Bind(&form); err != nil {
		c.JSON(400,gin.H{"code":"error","message":"请填写要修改的内容"})
		return
	}

	//验证数据
	if err := common.Validate(&form); err != ""{
		c.JSON(400,gin.H{"code":"error","message":err})
		return
	}

	PowerId := c.Query("power_id")
	if err := Db.Transaction(func(tx *gorm.DB) error {
		if len(PowerId) > 0 {
			var id string
			var model role_power.RolePower
			if err := Db.Model(&model).Where("role_id = ?",form.ID).Select("GROUP_CONCAT(id)").Find(&id).Error;err != nil {
				return err
			}

			PowerIdArr, DelId, err := common.ArrErgodic(strings.Split(PowerId, ","), strings.Split(id, ","))
				if err != nil  {
					if len(DelId) > 0 {
						if err := tx.Where("role_id in ?", DelId).Delete(&role_power.RolePower{}).Error; err != nil {
							return err
						}
					}
					if len(PowerId) > 0 {
						var Data []role_power.RolePower
						RolePowerData := role_power.RolePower{}
						for i, n := 0, len(PowerIdArr); i < n; i++ { // 常见的 for 循环，支持初始化语句。
							RolePowerData.RoleId = form.ID
							Pid,err := common.StrChangeUint(PowerIdArr[i])
							if err != nil{
								return err
							}

							RolePowerData.PowerId = Pid
							Data = append(Data,RolePowerData)
						}
						if err := tx.Create(&Data).Error;err != nil{
							return err
						}
					}
				}
			return nil
		}

		if err := Db.Where("id = ?",form.ID).Updates(&form).Error;err != nil {
			return err
		}
		return nil
	});err != nil{
		go jy_log.JyLog("修改失败，err：" + err.Error())
		c.JSON(400, gin.H{"code": "error", "message": "修改失败,err:"+err.Error()})
		return
	}
	c.JSON(200,gin.H{"code":"success","message":"修改成功"})
	return
}


// @Summary 角色删除
// @Description 角色删除
// @Tags 角色删除
// @Accept mpfd
// @Param id query string true "id"
// @Success 200 {string} string "{"message": "删除成功","code":"success"}"
// @Failure 400 {string} string "{"message": "删除失败","code":"error"}"
// @Router /admin/role_del [post]
func Del(c *gin.Context)  {
	id := c.DefaultPostForm("id", "")
	if id == "" {
		c.JSON(400, gin.H{"code": "error", "message": "请选择要删除的权限"})
		return
	}

	if err := Db.Delete(&RoleModel.Role{}, id).Error;err != nil{
		c.JSON(400,gin.H{"code":"error","message":"删除失败"})
		go jy_log.JyLog("删除失败，err：" + err.Error())
		return
	}
	Db.Where("role_id = ?", id).Delete(&role_power.RolePower{})
	c.JSON(200,gin.H{"code":"success","message":"删除成功"})
	return
}





